package cn.mengfly.testnrz.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;

/**
 * Zookeeper客户端创建类
 *
 * @author Mengfly
 */
public class ClientFactory {

    /**
     * 创建Zookeeper客户端实例
     *
     * @param connectionString    链接地址
     * @param connectionTimeoutMs 连接超时时间
     * @param sessionTimeoutMs    session(会话)超时时间
     * @return curatorFramework实例
     */
    public static CuratorFramework createSimple(String connectionString, int connectionTimeoutMs, int sessionTimeoutMs) {
        // 重试策略：第一次重试等待1s，第二次等待2s，第三次等待4s
        // 第一个参数：等待时间的基础单位，毫秒
        // 第二个参数，最大重试次数
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);
        // 获取CuratorFramework最简单的方法
        return CuratorFrameworkFactory.newClient(connectionString, sessionTimeoutMs, connectionTimeoutMs, retryPolicy);
    }

    /**
     * 创建Zookeeper客户端实例
     *
     * @param connectionString 链接地址
     * @return curatorFramework实例
     */
    public static CuratorFramework createSimple(String connectionString) {
        // 重试策略：第一次重试等待1s，第二次等待2s，第三次等待4s
        // 第一个参数：等待时间的基础单位，毫秒
        // 第二个参数，最大重试次数
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);
        // 获取CuratorFramework最简单的方法
        return CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
    }

    /**
     * @param connectionString    链接地址
     * @param connectionTimeoutMs 连接超时时间
     * @param sessionTimeoutMs    session(会话)超时时间
     * @param retryPolicy         重试策略
     * @return 客户端实例
     */
    public static CuratorFramework createWithOptions(String connectionString, RetryPolicy retryPolicy,
                                                     int connectionTimeoutMs, int sessionTimeoutMs) {
        // 使用Builder的方式创建实例
        return CuratorFrameworkFactory.builder().connectString(connectionString)
                .retryPolicy(retryPolicy)
                .connectionTimeoutMs(connectionTimeoutMs)
                .sessionTimeoutMs(sessionTimeoutMs)
                // 其他选项
                .build();
    }
}
